Основное противоречие в вычислительной физике возникает потому, что компьютеры представляют действительные числа с помощью математики с двоичной запятой. В отличие от человеческого мышления в десятичной системе счисления, аппаратное обеспечение хранит значения в двоичной системе. Это приводит к утечке абстракции: простые десятичные дроби, такие как 0.1, не могут быть представлены точно.
1. Реальность с плавающей запятой
Go предоставляет два основных типа для действительных чисел: float32 и float64. При использовании сокращенной синтаксической конструкции объявления переменных, например price := 0.0, Go по умолчанию использует float64. Эти типы являются приближениями к реальности, а не точными математическими значениями.
2. Загадка 0.1
В десятичной системе $1/3$ даёт бесконечную периодическую десятичную дробь ($0.333...$). В двоичной системе значение $0.1$ даёт бесконечную периодическую дробь. Поскольку память компьютера конечна, эта дробь обрезается, что приводит к накоплению ошибок. Например, $0.1 + 0.2$ даёт $0.30000000000000004$, а не точно $0.3$.
Предупреждение: Никогда не используйте == для сравнения чисел с плавающей запятой в логических операциях, так как эти микроскопические расхождения приведут к сбою сравнений.